<?php

/**
 * AdministracaoController
 *
 * Classe responsavel por gerenciar as requisicoes do menu de Administracao
 *
 * @author  Richard Brandao <richardsbrandao@gmail.com>
 *
 */
class AdministracaoController extends Controller {
    /**
     * @final   pacote das views deste controller
     */

    const PACKAGE_VIEW = 'administracao';

    /**
     * @var AdministracaoService
     */
    private $administracaoService;
    /**
     * @var UsuarioService
     */
    private $usuarioService;
    /**
     * @var DepartamentoService
     */
    private $departamentoService;
    /**
     * @var SetorService
     */
    private $setorService;
    /**
     * @var FuncaoService
     */
    private $funcaoService;
    /**
     * @var FerramentaService
     */
    private $ferramentaService;
    /**
     * @var PreferenciaService
     */
    private $preferenciaService;
    /**
     * @var PagamentoService
     */
    private $pagamentoService;

    /**
     * __construct
     * Inicializa todos os servicos usuados por AdministracaoController
     */
    public function __construct() {
        $this->administracaoService = AdministracaoService::getInstance();
        $this->usuarioService = UsuarioService::getInstance();
        $this->departamentoService = DepartamentoService::getInstance();
        $this->setorService = SetorService::getInstance();
        $this->funcaoService = FuncaoService::getInstance();
        $this->ferramentaService = FerramentaService::getInstance();
        $this->preferenciaService = PreferenciaService::getInstance();
        $this->pagamentoService = PagamentoService::getInstance();
    }

    /**
     * @method  funcionarios
     *
     * Lista todos os Funcionarios cadastrados
     *
     * @since   Dezembro de 2011
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function funcionarios() {
        $ArUsersList = $this->usuarioService->findAll(true);
        $this->save(SESSION_INTERFACE, 'ArUserList', $ArUsersList);
        $this->view('funcionarios', self::PACKAGE_VIEW);
    }

    /**
     * @method  visualizarFuncionario
     *
     * Visualiza todos os dados do funcionario
     *
     * @since   Janeiro de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function visualizarFuncionario() {
        $IDUsuario = treatUrl('id');
        multipleEntities($IDUsuario);
        $Usuario = $this->usuarioService->findById($IDUsuario);
        $this->save(SESSION_INTERFACE, 'UserView', $Usuario);
        $this->view('visualizar_funcionario', self::PACKAGE_VIEW);
    }

    /**
     * @method  filter
     * @access  ajax
     * @uses    AdministracaoController::funcionarios
     *
     * Acessado via ajax, realiza filtros de funcionarios cadastrados
     *
     * @since   Dezembro de 2011
     */
    public function filter() {
        $filterType = treatUrl('type');
        $IDFilter = $_POST['filterkey'];
        multipleEntities($IDFilter);

        $ArUserList = $this->administracaoService->findUserByFilter($IDFilter, $filterType);

        $this->save(SESSION_INTERFACE, 'ArUserList', $ArUserList);

        if( $filterType == 'employee' )  {
            $this->view('usertablelist', self::PACKAGE_VIEW, true);
        } else if( $filterType == 'employee-payment' ) {
            $this->view('paymentusertablelist', self::PACKAGE_VIEW, true);
        }
    }

    /**
     * @method  editarFuncionario
     *
     * Inclui a view de edicao completa do usuario, so pode ser visualizada
     * por quem tem acesso a administracao do usuario
     *
     * @since   Dezembro de 2011
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     *
     */
    public function editarFuncionario() {
        $IDUsuario = treatUrl('id');
        multipleEntities($IDUsuario);
        $Usuario = $this->administracaoService->findEmployeeById($IDUsuario);
        $ArDepartamentos = $this->departamentoService->findAll();
        $ArFuncoes = $this->funcaoService->findAll();

        $this->save(SESSION_INTERFACE, 'UsuarioEdit', $Usuario);
        $this->save(SESSION_INTERFACE, 'DepartamentsList', $ArDepartamentos);
        $this->save(SESSION_INTERFACE, 'PositionsList', $ArFuncoes);

        $this->view('editar', self::PACKAGE_VIEW);
    }

    /**
     * @method  cadastrarFuncionario
     *
     * Inclui a view de cadastro de Funcionario, ela deve fornecer todos os dados
     * necessarios para cadastro, como lista de departamentos, lista de funcoes
     * e perfis do sistema, lista de ferramentas e preferencias do usuario.
     *
     * @since   Janeiro de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function cadastrarFuncionario() {
        $ArDepartamentos = $this->departamentoService->findAll();
        $ArFuncoes = $this->funcaoService->findAll();
        $ArFerramentas = $this->ferramentaService->findAll();
        $ArPreferences = $this->preferenciaService->findAll();

        $this->save(SESSION_INTERFACE, 'DepartamentsList', $ArDepartamentos);
        $this->save(SESSION_INTERFACE, 'PositionsList', $ArFuncoes);
        $this->save(SESSION_INTERFACE, 'ToolsList', $ArFerramentas);
        $this->save(SESSION_INTERFACE, 'PreferencesList', $ArPreferences);

        $this->view('cadastrar_funcionario', self::PACKAGE_VIEW);
    }

    /**
     * @method  atualizarFuncionario
     *
     * Realiza a edicao do usuario, altera os dados da tabela de Usuario, Administracao,
     * Funcao, Perfil, Setor, Departamento e outras. Tudo que tiver em questao com
     * o usuario recebido no post.
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Dezembro de 2011
     */
    public function atualizarFuncionario() {
        $ArDados = $_POST;
        $ArOptionalField = array('ItRamal', 'DtDemissao', 'StComplemento');
        foreach ($ArDados['Pessoal'] as $StField => $StValue) {
            if (!in_array($StField, $ArOptionalField) && empty($StValue)) {
                $this->saveReturn('O campo "' + substr($StField, 2) + '" n&atilde;o foi recebido.');
            }
        }
        if (!$this->hasReturn()) {
            foreach ($ArDados['Administrativo'] as $StField => $StValue) {
                if (!in_array($StField, $ArOptionalField) && empty($StValue)) {
                    $this->saveReturn('O campo "' + substr($StField, 2) + '" n&atilde;o foi recebido.');
                }
            }
        }
        if (!$this->hasReturn() && !empty($ArDados['Dependente'])) {
            foreach ($ArDados['Dependente'] as $ArDependente) {
                foreach ($ArDependente as $StField => $StValue) {
                    if (empty($StValue)) {
                        $this->saveReturn('O campo "' + substr($StField, 2) + '" n&atilde;o foi recebido.');
                    }
                }
            }
        }
        if (!$this->hasReturn()) {
            foreach ($ArDados['Funcao'] as $StField => $StValue) {
                if (empty($StValue)) {
                    $this->saveReturn('O campo "' + substr($StField, 2) + '" n&atilde;o foi recebido.');
                }
            }
        }
        if (!$this->hasReturn()) {
            if (!Validation::Email($ArDados['Pessoal']['StEmail'])) {
                $this->saveReturn('Email em formato inv&aacute;lido.');
            } else if (!Validation::Date($ArDados['Pessoal']['DtNascimento'])) {
                $this->saveReturn('Nascimento em formato inv&aacute;lido.');
            } else if (!Validation::Cep($ArDados['Pessoal']['StCep'])) {
                $this->saveReturn('Cep em formato inv&aacute;lido.');
            } else if (!Validation::Phone($ArDados['Pessoal']['StTelefone'])) {
                $this->saveReturn('Telefone em formato inv&aacute;lido.');
            } else if (!Validation::Phone($ArDados['Pessoal']['StCelular'])) {
                $this->saveReturn('Celular em formato inv&aacute;lido.');
            } else if (!empty($ArDados['Pessoal']['ItRamal']) && !Validation::Number($ArDados['Pessoal']['ItRamal'])) {
                $this->saveReturn('Ramal em formato inv&aacute;lido.');
            } else if (!Validation::Cpf($ArDados['Pessoal']['StCpf'])) {
                $this->saveReturn('CPF em formato inv&aacute;lido.');
            } else if (!Validation::Date($ArDados['Administrativo']['DtAdmissao'])) {
                $this->saveReturn('Data de Admiss&atilde;o em formato inv&aacute;lido.');
            } else if (!empty($ArDados['Administrativo']['DtDemissao']) && !Validation::Date($ArDados['Administrativo']['DtDemissao'])) {
                $this->saveReturn('Data de Demiss&atilde;o em formato inv&aacute;lido.');
            } else {
                if (!empty($ArDados['Dependente'])) {
                    foreach ($ArDados['Dependente'] as $ArDadosDependente) {
                        if (!Validation::Date($ArDadosDependente['DtNascimentoDependente'])) {
                            $this->saveReturn('Dependente com nascimento em formato inv&aacute;lido.');
                        }
                    }
                }
            }
        }

        $ArDados['Pessoal']['EnStatus'] = $ArDados['Administrativo']['EnStatus'] == 'CONTRATADO' ? 'ATIVADO' : 'DESATIVADO';
        $ArDados['Pessoal']['DtNascimento'] = dateBRtoBD($ArDados['Pessoal']['DtNascimento']);
        $ArDados['Administrativo']['DtAdmissao'] = dateBRtoBD($ArDados['Administrativo']['DtAdmissao']);
        $ArDados['Administrativo']['DtDemissao'] = dateBRtoBD($ArDados['Administrativo']['DtDemissao']);

        $ArDados['Dependente'] =  !empty($ArDados['Dependente']) ? $ArDados['Dependente'] : array();
        foreach ($ArDados['Dependente'] as &$ArDadosDependente) {
            $ArDadosDependente['DtNascimentoDependente'] = dateBRtoBD($ArDadosDependente['DtNascimentoDependente']);
        }

        if (!$this->hasReturn()) {
            multipleEntities($ArDados);

            if ($this->administracaoService->updateEmployee($ArDados)) {
                $this->saveReturn('Usu&aacute;rio alterado com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao alterar dados do usu&aacute;rio.');
            }
        }

        $this->showJsonResponse();
    }

    /**
     * @method  inserirFuncionario
     *
     * Realiza a insercao de um funcionario no sistema.
     *
     * @since   Janeiro de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function inserirFuncionario() {
        $ArDados = $_POST;
        $ArOptionalField = array('ItRamal', 'StComplemento');
        foreach ($ArDados['Pessoal'] as $StField => $StValue) {
            if (!in_array($StField, $ArOptionalField) && empty($StValue)) {
                $this->saveReturn('O campo "' + substr($StField, 2) + '" n&atilde;o foi recebido.');
            }
        }
        if (!$this->hasReturn()) {
            foreach ($ArDados['Administrativo'] as $StField => $StValue) {
                if (!in_array($StField, $ArOptionalField) && empty($StValue)) {
                    $this->saveReturn('O campo "' + substr($StField, 2) + '" n&atilde;o foi recebido.');
                }
            }
        }
        if (!$this->hasReturn() && !empty($ArDados['Dependente'])) {
            foreach ($ArDados['Dependente'] as $ArDependente) {
                foreach ($ArDependente as $StField => $StValue) {
                    if (empty($StValue)) {
                        $this->saveReturn('O campo "' + substr($StField, 2) + '" n&atilde;o foi recebido.');
                    }
                }
            }
        }
        if (!$this->hasReturn()) {
            foreach ($ArDados['Funcao'] as $StField => $StValue) {
                if (empty($StValue)) {
                    $this->saveReturn('O campo "' + substr($StField, 2) + '" n&atilde;o foi recebido.');
                }
            }
        }
        if (!$this->hasReturn()) {
            foreach ($ArDados['Preferencias'] as $StField => $StValue) {
                if (empty($StValue)) {
                    $this->saveReturn('O campo "' + substr($StField, 2) + '" n&atilde;o foi recebido.');
                }
            }
        }
        if (!$this->hasReturn()) {
            if (!Validation::Email($ArDados['Pessoal']['StEmail'])) {
                $this->saveReturn('Email em formato inv&aacute;lido.');
            } else if (!Validation::Date($ArDados['Pessoal']['DtNascimento'])) {
                $this->saveReturn('Nascimento em formato inv&aacute;lido.');
            } else if (!Validation::Cep($ArDados['Pessoal']['StCep'])) {
                $this->saveReturn('Cep em formato inv&aacute;lido.');
            } else if (!Validation::Phone($ArDados['Pessoal']['StTelefone'])) {
                $this->saveReturn('Telefone em formato inv&aacute;lido.');
            } else if (!Validation::Phone($ArDados['Pessoal']['StCelular'])) {
                $this->saveReturn('Celular em formato inv&aacute;lido.');
            } else if (!empty($ArDados['Pessoal']['ItRamal']) && !Validation::Number($ArDados['Pessoal']['ItRamal'])) {
                $this->saveReturn('Ramal em formato inv&aacute;lido.');
            } else if (!Validation::Cpf($ArDados['Pessoal']['StCpf'])) {
                $this->saveReturn('CPF em formato inv&aacute;lido.');
            } else if (!Validation::Date($ArDados['Administrativo']['DtAdmissao'])) {
                $this->saveReturn('Data de Admiss&atilde;o em formato inv&aacute;lido.');
            } else {
                if (!empty($ArDados['Dependente'])) {
                    foreach ($ArDados['Dependente'] as $ArDadosDependente) {
                        if (!Validation::Date($ArDadosDependente['DtNascimentoDependente'])) {
                            $this->saveReturn('Dependente com nascimento em formato inv&aacute;lido.');
                        }
                    }
                }
            }
        }

        $ArDados['Pessoal']['DtNascimento'] = dateBRtoBD($ArDados['Pessoal']['DtNascimento']);
        $ArDados['Administrativo']['DtAdmissao'] = dateBRtoBD($ArDados['Administrativo']['DtAdmissao']);

        if (!empty($ArDados['Dependente'])) {
            foreach ($ArDados['Dependente'] as &$ArDadosDependente) {
                $ArDadosDependente['DtNascimentoDependente'] = dateBRtoBD($ArDadosDependente['DtNascimentoDependente']);
            }
        }

        if (!$this->hasReturn()) {
            multipleEntities($ArDados);
            if ($this->administracaoService->saveEmployee($ArDados)) {
                $this->saveReturn('Usu&aacute;rio criado com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao criar usu&aacute;rio. Certifique-se que o CPF ou Email são únicos no sistema.');
            }
        }

        $this->showJsonResponse();
    }

    public function folhaSalarial() {
        $this->save(SESSION_INTERFACE, 'GeneralSalarialSheetReport', $this->administracaoService->getGeneralSalarialSheet());
        $this->save(SESSION_INTERFACE, 'PositionSalarialSheetReport', $this->administracaoService->getPositionSalarialSheet());
        $this->save(SESSION_INTERFACE, 'DepartamentSalarialSheetReport', $this->administracaoService->getDepartamentSalarialSheet());
        $this->save(SESSION_INTERFACE, 'SectorSalarialSheetReport', $this->administracaoService->getSectorSalarialSheet());

        $this->view('folha_salarial', self::PACKAGE_VIEW);
    }

    public function ultimosFuncionariosRegistrados() {
        $this->save(SESSION_INTERFACE, 'LastRegisteredEmployeesReport', $this->administracaoService->getLastRegisteredEmployees());
        $this->save(SESSION_INTERFACE, 'LastFiredEmployeesReport', $this->administracaoService->getLastFiredEmployees());
        $this->view('funcionarios_registrados', self::PACKAGE_VIEW);
    }

    public function controlePagamento() {
        $this->save(SESSION_INTERFACE, 'ArUserList', $this->usuarioService->findUsersWithPendingPayment());
        $this->view('controle_pagamento_usuarios', self::PACKAGE_VIEW);
    }

    public function lancarPagamentoFuncionario() {
        $IDUsuario = treatUrl('id');
        multipleEntities($IDUsuario);
        $User = $this->usuarioService->findById($IDUsuario);
        $this->save(SESSION_INTERFACE, 'User', $User);
        $this->save(SESSION_INTERFACE, 'PeriodList', $this->pagamentoService->findPendingPeriodByUser($User));
        $this->view('lancar_pagamento_funcionario', self::PACKAGE_VIEW);
    }

    public function executarPagamento() {
        $ArDados = $_POST;
        multipleEntities($ArDados);

        if( empty($ArDados['IDUsuario']) ) {
            $this->saveReturn('O Campo "IDUsuario" não foi recebido!');
        }

        foreach($ArDados['Payments'] as &$ArPayment) {
            $ArPayment['DtDiaPagamento'] = dateBRtoBD($ArPayment['DtDiaPagamento']);
        }
        //VALIDAR FORM
        if( !$this->hasReturn() ) {
            if( $this->pagamentoService->release($ArDados['IDUsuario'], $ArDados['Payments']) ) {
                $this->saveReturn('Pagamento(s) realizado(s) com sucesso!', 1);
            } else {
                $this->saveReturn('Ocorreu um erro na confirmação do pagamento. Nenhum pagamento foi confirmado!');
            }
        }

        $this->showJsonResponse();
    }

}